#include <pthread.h>
#include "app_common.h"
#include  <stdio.h>
#include "log.h"
#include  <unistd.h>
#include  <stdlib.h>

static int sqrt_num(int num)
{
    sleep(1);
    return num * num; 
}

static void *sqrt_num_thread_func(void *arg)
{
    sleep(1);
    //1  先强转 void *  -> int *
    int *num_p = (int *)arg;
    // 2 解引用  
    int num= *num_p;
    //3  计算 
    int result=num*num;
    //4  声明一个指针 开辟堆空间
    int *result_p = (int *)malloc(sizeof(int));
    //5 让指针指向计算结果 
    *result_p=result;
    return (void *)result_p;
}

int main(int argc, char const *argv[])
{
    //计算一个数组 每个元素的平方值 然后求和 
    int nums[] = {1, 2, 3, 4, 5};
    int result[5];
    int sum = 0;
    long start_ts= app_common_getcurtime_ms();

    // 1 计算每个数的平方值 放到一个结果数组中
    pthread_t pthread_ids[5];

    for (int i = 0; i < 5; i++)
    {
        // result[i] = sqrt_num(nums[i]);
        pthread_create(&pthread_ids[i], NULL,  sqrt_num_thread_func, (void *)&nums[i]);
        //pthread_join(pthread_ids[i], NULL); //可以写在这里吗？ 不行 会变成串行
    }

    // 收集结果
    for (size_t i = 0; i < 5; i++)
    {   // 1 声明一个空指针
         void *result_p;
         pthread_join(pthread_ids[i], &result_p);
         //2 从指针下提取数据 
         //强转 
         int *result_int_p =(int*) result_p;
         // 解引用
         result[i] = *result_int_p;
    }
    
    long end_ts= app_common_getcurtime_ms();
    log_info (" diff time : %ld", end_ts-start_ts);
    
    // 求和
    for (size_t i = 0; i < 5; i++)
    {
         sum += result[i];
    }
    printf("sum = %d\n", sum);
    return 0;
}
